import win32security
import ntsecuritycon
import os
import sys

def get_file_security_info(file_path):
    """
    获取文件或文件夹的安全信息
    """
    try:
        # 获取文件的安全描述符
        sd = win32security.GetFileSecurity(
            file_path, win32security.DACL_SECURITY_INFORMATION
        )
        dacl = sd.GetSecurityDescriptorDacl()
        
        if dacl is None:
            print("没有找到DACL（自由访问控制列表）")
            return
        
        print(f"文件路径: {file_path}")
        print("权限信息:")
        print("-" * 50)
        
        # 遍历DACL中的每个ACE（访问控制条目）
        for ace_index in range(dacl.GetAceCount()):
            ace = dacl.GetAce(ace_index)
            ace_type, ace_mask, sid = ace
            
            # 获取账户名和域名
            try:
                account_name, domain, _ = win32security.LookupAccountSid(None, sid)
                full_name = f"{domain}\\{account_name}" if domain else account_name
            except:
                full_name = f"无法解析的SID: {sid}"
            
            # 获取权限类型
            access_type = "允许" if ace_type == win32security.ACCESS_ALLOWED_ACE_TYPE else "拒绝"
            
            # 解析权限掩码
            permissions = []
            if ace_mask & ntsecuritycon.FILE_READ_DATA:
                permissions.append("读取数据")
            if ace_mask & ntsecuritycon.FILE_WRITE_DATA:
                permissions.append("写入数据")
            if ace_mask & ntsecuritycon.FILE_APPEND_DATA:
                permissions.append("追加数据")
            if ace_mask & ntsecuritycon.FILE_READ_EA:
                permissions.append("读取扩展属性")
            if ace_mask & ntsecuritycon.FILE_WRITE_EA:
                permissions.append("写入扩展属性")
            if ace_mask & ntsecuritycon.FILE_EXECUTE:
                permissions.append("执行")
            if ace_mask & ntsecuritycon.FILE_READ_ATTRIBUTES:
                permissions.append("读取属性")
            if ace_mask & ntsecuritycon.FILE_WRITE_ATTRIBUTES:
                permissions.append("写入属性")
            if ace_mask & ntsecuritycon.DELETE:
                permissions.append("删除")
            if ace_mask & ntsecuritycon.READ_CONTROL:
                permissions.append("读取权限")
            if ace_mask & ntsecuritycon.WRITE_DAC:
                permissions.append("修改权限")
            if ace_mask & ntsecuritycon.WRITE_OWNER:
                permissions.append("取得所有权")
            if ace_mask & ntsecuritycon.SYNCHRONIZE:
                permissions.append("同步")
            if ace_mask & ntsecuritycon.FILE_ALL_ACCESS:
                permissions.append("完全控制")
            
            print(f"用户/组: {full_name}")
            print(f"访问类型: {access_type}")
            print(f"权限: {', '.join(permissions)}")
            print("-" * 30)
            
    except Exception as e:
        print(f"处理文件 {file_path} 时出错: {str(e)}")

def main():
    if len(sys.argv) != 2:
        print("用法: python nas_permissions.py <NAS文件或文件夹路径>")
        print("例如: python nas_permissions.py \"\\\\nas-server\\share\\folder\"")
        sys.exit(1)
    
    file_path = sys.argv[1]
    
    # 检查路径是否存在
    if not os.path.exists(file_path):
        print(f"错误: 路径 '{file_path}' 不存在")
        sys.exit(1)
    
    get_file_security_info(file_path)

if __name__ == "__main__":
    main()